﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AqueleAjax.UI;

namespace AqueleAjax.UI.Controls
{
    /// <summary>
    /// Representa um controle do tipo DropDownList com chamadas assíncronas ao servidor.
    /// </summary>
    public class AjaxDropDownList : DropDownList, IAjaxControl
    {
        #region Propriedades

        private AjaxMainControl _currentMainControl;

        /// <summary>
        /// Instância do AjaxMainControl inserido na página relacionada ao controle atual.
        /// </summary>
        public AjaxMainControl CurrentMainControl
        {
            get
            {
                if (this._currentMainControl == null)
                {
                    this._currentMainControl = AjaxMainControl.GetAjaxMainControl(this.Page);
                }

                return this._currentMainControl;
            }
        }
        #endregion

        #region Métodos públicos
        /// <summary>
        /// Obtem o resultado da chamada assíncrona. O conteúdo é um texto contendo instruções JavaScript.
        /// </summary>
        /// <returns>Conteúdo é um texto contendo instruções JavaScript.</returns>
        public virtual string GetCallbackResult()
        {
            return this.CurrentMainControl.GetCallbackResult();
        }

        /// <summary>
        /// Método chamado quando o post assíncrono é iniciado.
        /// </summary>
        /// <param name="eventArgument">Argumentos recebidos da página.</param>
        public virtual void RaiseCallbackEvent(string eventArgument)
        {
        }
        #endregion

        #region Métodos protegidos
        /// <summary>
        /// Faz a primeira configuração dos controles na página.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            this.SetCallbackEventReference();
        }
        #endregion

        #region Métodos privados
        /// <summary>
        /// Configura o evento que disparará a chamada assíncrona.
        /// </summary>
        private void SetCallbackEventReference()
        {
            this.Attributes.Add("onchange", AjaxMainControl.CallbackEventReference(this));
        }
        #endregion
    }
}
